package java6703.generic;

import java.util.*;
import java.util.ArrayList;
import java.util.TreeMap;
import java.util.List;
import java.util.Map;

public class Counter6703 {
    public static void main(String[] args) {

        /*
        实现思路：
        （1）先将Map转为List<Entry>；
        （2）采用比较器排序法对List<Entry>排序；
        （3）分析排序规则；
        （4）实现排序规则；
        （5）调用sort方法完成排序；
         */

        System.out.print("请输入字符串:");

        //键盘录入字符串
        Scanner scanner = new Scanner(System.in);

        String input = scanner.nextLine();

        //对输入的字符串进行拆分
        input = input.replaceAll(" +", " ");

        //将Map转为List<Entry>
        List<Map.Entry<Character, Integer>> entries = count6703(input);

        //采用比较器排序法对List<Entry>排序
        entries.sort(new Comparator<Map.Entry<Character, Integer>>() {


//            排序规则：
//            ①首先按字符出现次数降序；
//            ②次数相同时按字母序升序；
            @Override
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
                int num = o2.getValue() - o1.getValue();
                return num == 0 ?  o1.getKey() - o2.getKey(): num;
            }
        });

        System.out.println("\n按字符出现次数降序(字频降序):");
        System.out.print("包含:");

        for (Map.Entry<Character, Integer> list : entries) {

            //调用sort方法完成排序
            System.out.print("字符"+list.getKey()+"="+list.getValue()+" ");
        }
    }

    private static List<Map.Entry<Character, Integer>> count6703(String input) {
        TreeMap<Character, Integer> treeMap = new TreeMap<Character, Integer>();
        char[] ch = input.toCharArray();

        //若获取到的value为空，则设置初始值为1
        for (char c : ch) {
            Integer i = treeMap.get(c);
            if (i == null) {
                treeMap.put(c, 1);
            } else {
                treeMap.put(c, ++i);
            }
        }

        List<Map.Entry<Character, Integer>> list =
                new ArrayList<Map.Entry<Character, Integer>>(treeMap.entrySet());
        return list;
    }
}
